/**
 * Copyright 2006 gworks.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 */
/* Licence:
*   Use this however/wherever you like, just don't blame me if it breaks anything.
*
* Credit:
*   If you're nice, you'll leave this bit:
*
*   Class by Pierre-Alexandre Losson -- http://www.telio.be/blog
*   email : plosson@users.sourceforge.net
*/
package org.javaongems.runtime.fileupload;

import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.fileupload.FileItem;

/**
 * <p>Provides a monitorable output stream extension to the JDKs output stream
 * such that progress can be reported incrementally as commons fileupload 
 * parses each boundary in a multi-part post.</p>
 * <p>Responsiblities:
 * <ul>
 * 	<li> decorates an output stream with with monitoring support as
 * 		bytes are written to it. 
 * </ul>
 * </p>
 * @author Pierre-Alexandre Losson, some hacks by Ashin Wimalajeewa (ash)
 */
public class MonitoredOutputStream extends OutputStream {
	private FileItem source;
	private OutputStream delegate;
	private MonitoredOutputStreamListener listener;

	public MonitoredOutputStream(FileItem src, OutputStream target,
			MonitoredOutputStreamListener listener) {
		delegate = target;
		source = src;
		this.listener = listener;
		this.listener.onStart(source);
	}

	public void write(byte b[], int off, int len) throws IOException {
		delegate.write(b, off, len);
		listener.onBytesRead(len - off);
	}

	public void write(byte b[]) throws IOException {
		delegate.write(b);
		listener.onBytesRead(b.length);
	}

	public void write(int b) throws IOException {
		delegate.write(b);
		listener.onBytesRead(1);
	}

	public void close() throws IOException {
		delegate.close();
		listener.onDone();
	}
	
    public void flush() throws IOException {
    	delegate.flush();
    }

}
